2342

Created at : 2024-11-19 17:58
2342

#include <iostream>
#include <array>

constexpr int MaxDDR = 100'000;
constexpr int64_t DPMax = INT64_MAX;

using namespace std;

int64_t DP[MaxDDR + 1][5][5];

int64_t CalcCost(int From, int To);
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    for(int l = 0; l < 5; ++l) for(int r = 0; r < 5; ++r) DP[0][l][r] = DPMax;
    DP[0][0][0] = 0;

    int i = 0;
    while(true)
    {
        int Pos;
        cin >> Pos;
        if(Pos == 0)
        {
            int64_t Result = DPMax;
            for(int l = 0; l < 5; ++l) for(int r = 0; r < 5; ++r) Result = min(Result, DP[i][l][r]);
            cout << Result;
            break;
        }
        ++i;
        for(int l = 0; l < 5; ++l) for(int r = 0; r < 5; ++r) DP[i][l][r] = DPMax;
        for(int l = 0; l < 5; ++l)
        {
            for(int r = 0; r < 5; ++r)
            {
                if(DP[i - 1][l][r] == DPMax) continue;
                DP[i][l][Pos] = min(DP[i][l][Pos], DP[i - 1][l][r] + CalcCost(r, Pos));
                DP[i][Pos][r] = min(DP[i][Pos][r], DP[i - 1][l][r] + CalcCost(l, Pos));
            }
        }
    }

    return 0;
}

int64_t CalcCost(int From, int To)
{
    if(From == To) return 1;
    else if(From == 0) return 2;
    else if(abs(From - To) == 2) return 4;
    else return 3;
}

유형